package com.cscp.spcache;

import com.cronutils.builder.CronBuilder;
import com.cronutils.descriptor.CronDescriptor;
import com.cronutils.mapper.CronMapper;
import com.cronutils.model.Cron;
import com.cronutils.model.definition.CronConstraintsFactory;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.model.field.expression.FieldExpression;
import com.cronutils.model.time.ExecutionTime;
import com.cronutils.parser.CronParser;

import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import static com.cronutils.model.CronType.QUARTZ;
import static com.cronutils.model.CronType.UNIX;
import static com.cronutils.model.field.expression.FieldExpressionFactory.*;

/**
 * This class provides a main method to showcase common use cases for the cron-utils library.
 */
public class CronUtilsTest {

  public static void main(String[] args) {

    /**
     * 除了基本的数字范围外，Cron 表达式还支持一些特殊符号和字符：
     * 星号（*）：表示匹配任意值。例如，* 在分钟字段中表示每分钟都执行。
     * 逗号（,）：用于分隔多个值。例如，1,3,5 在小时字段中表示 1 点、3 点和 5 点执行。
     * 斜线（/）：用于指定间隔值。例如，“/ 在分钟字段中表示每 5 分钟执行一次。
     * 连字符（-）：用于指定范围。例如，10 - 20 在日期字段中表示从 10 号到 20 号。
     * 问号（?）：仅用于日期和星期几字段，表示不指定具体值。通常用于避免冲突。
     */
    List<FieldExpression> expressions = new ArrayList<>();
    expressions.add(on(1));
    expressions.add(on(5));

    Cron quartzBuiltCronExpression = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(QUARTZ))
            .withYear(always()) // 每年
            .withMonth(always()) // 每个月
             .withDoM(and(expressions)) //每月的几号
             .withDoW(questionMark()) //每周的某天
            .withHour(on(1)) // 每个小时
            .withMinute(on(3)) // 每分钟
            .withSecond(on(0)) // 0秒
            .instance();
    String quartzBuiltCronExpressionString = quartzBuiltCronExpression.asString();


    // Lets compare this expressions
    System.out.println(String.format("Original Quartz cron expression: '%s' ",
            quartzBuiltCronExpressionString)
    );


  }





}
